package com.hp.virtual;

import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.IntStream;

/**
 * Java 21 中虚拟线程（Virtual Thread）的使用，主要功能如下：
 * 1、创建一个线程安全的 Set 用于保存所有执行任务的线程名称。
 * 2、使用 Executors.newVirtualThreadPerTaskExecutor() 创建一个虚拟线程池。
 * 3、提交 100 万个任务，每个任务将当前线程信息中的名称部分提取并存入集合。
 * 4、等待 5 秒后输出使用的不同平台线程数量。
 * 结论：通过虚拟线程实现高并发任务，但实际使用的操作系统线程数远小于任务数。
 *
 * @author hp
 */
public class VTDemo2 {

    public static void main(String[] args) throws InterruptedException {

        Set<String> threadNames = ConcurrentHashMap.newKeySet();

        ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();

        IntStream.range(0, 1000000).forEach(i -> executor.submit(() -> {
            String threadInfo = Thread.currentThread().toString();
            String workerName = threadInfo.split("@")[1];
            threadNames.add(workerName);
            return i;
        }));

        Thread.sleep(5000);
        System.out.println("Platform Threads: " + threadNames.size());

    }
}